#pragma once

#ifndef _CONNECTION_POOL_
#define _CONNECTION_POOL_
#include <mysql/mysql.h>
#include <memory>
#include <string>
#include <list>
#include "../Lock/Locker.hpp"
using std::string;
class ConnectionPool
{
public:
    MYSQL* GetConnect();                                    // 获取数据库连接   
    bool ReleaseConnection(MYSQL* _conn);                   // 释放数据库连接
    const int GetFreeConn() const;                          // 获取空闲的连接
    void DestoryPool();                                     // 销毁连接池

    static ConnectionPool* GetInstance();                   // 获取实例对象

    void Init(string _url,string _usr,string _passWord,string _dataBaseName,int _port,unsigned int _maxCount);      

    ConnectionPool();
    ~ConnectionPool();                    
private:
    size_t m_MaxConn;                                       // 最大连接数
    size_t m_CurConn;                                       // 目前占用的连接数
    size_t m_FreeConn;                                      // 空闲的连接数
private:
    string m_url;
    int m_port;
    string m_user;
    string m_password;
    string m_dataBaseName;
private:
    Locker m_lock;                                          // 互斥锁                                             
    Sem m_sem;                                              // 信号量
    std::list<MYSQL*> m_connList;                           // 连接池
};

class ConnectionRALL
{
public:
    /**
     * 通过此方法运行时动态获取一个空闲队列
     * @param _conn 需要分配的MySQL连接
     * @param _pool 数据库池
     */
    ConnectionRALL(MYSQL** _conn,ConnectionPool* _pool);
    ~ConnectionRALL();
private:
    MYSQL* m_connRALL;
    ConnectionPool* m_poolRALL;
};

#endif // _CONNECTION_POOL_